<?php
/**
 * Сессии в базе данных
 * 
 * Класс для работы с сессиями хранимыми в базе данных
 * @author Anton Zavidov
 * @package myLiveShop
 */

import("core.session");
/**
 * Класс для работы с сессиями хранимыми в базе данных
 *
 */
class DBSession extends Session{
	/**
	 *Объект базы
	 *
	 * @var db
	 */
	private $base=null;
	/**
	 * Id текущего пользователя
	 *
	 * @var int
	 */
	public $current_user=0;
	/**
	 * Хеш сессии
	 *
	 * @var string
	 */
	private $hash=null;
	/**
	 * Констуктор
	 *
	 * @param string $className имя контроллера
	 */
	public function __construct($className=null){
		
		parent::__construct($className?$className:__CLASS__);
	}
	/**
	 * Открываем сессию
	 *
	 * @param string $save_path
	 * @param string $session_name
	 */
	public function open($save_path=null, $session_name=null){
		if(!$this->base){	
			$this->base=Core::getDB();
		}
		//записыываем id сесии в переменную mysql
		$this->base->query('SET @current_session='.$this->base->eraseData($this->getId(),DB::TYPE_STRING));
		if(checkLogConfig("debug"))new Log("Запущенна сессия ");
		//$_SESSION=array();
		return true;
	}
	/**
	 * Закрываем сессию
	 *
	 */
	public function close(){
		//$this->base->delete(Config::_("session_table"),'`key`="'.$this->getId().'"');
		if(checkLogConfig("debug"))new Log("Cесcия закрыта");
		return true;
	}
	/**
	 * Читаем данные
	 *
	 * @param string $id имя переменной
	 * @return mixed
	 */
	public function read($id){
		//обрабатываем имя переменной
		$result=$this->base->getArray('SELECT `value`,`hash` FROM '.Config::_("session_table").' WHERE `key`='.$this->base->eraseData($id,DB::TYPE_STRING).' LIMIT 1',true);
		$this->hash=$result['hash'];
		return stripslashes($result['value']);
	}
	/**
	 * Записываем данные
	 *
	 * @param string $id имя переменной
	 * @param string $sess_data данные
	 */
	public function write($id, $sess_data){
		$hash=md5($sess_data);
		if($hash==$this->hash){
			$this->base->update(Config::_("session_table"),array('modification'=>gmdate("Y-m-d H:i:s")),"`key`='".$id."' LIMIT 1");
			return;
		}
		$this->base->eraseData($sess_data,DB::TYPE_STRING);
		$this->base->eraseData($id,DB::TYPE_STRING);
		$this->base->query("INSERT INTO `".Config::_("session_table")."` 
		(`key`,`value`,`modification`,`user_id`,`hash`) 
		VALUES (".$id.",".$sess_data.",'".gmdate("Y-m-d H:i:s")."',".$this->current_user.", '".$hash."') 
		ON DUPLICATE KEY UPDATE `value`=".$sess_data.", `modification`='".gmdate("Y-m-d H:i:s")."', `hash`='".$hash."'");
	}
	/**
	 * Удаляем данные
	 *
	 * @param string $id имя переменной
	 */
	public function destroy($id){
		//обрабатываем имя переменной
		$this->base->eraseData($id,DB::TYPE_STRING);
		$this->base->delete(Config::_("session_table"),'`key`="'.$id.'"');
		return true;
	}
	/**
	 * Очищаем просроченные сессии
	 *
	 * @param int $maxlifetime время жизни сессии
	 */
	public function gc($maxlifetime){
		if(checkLogConfig("debug"))new Log("Запущен чистильщик сессий ");
		return true;
	}
}